package demo1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.lang.annotation.Annotation;

/**
 * Spring核心框架，是一个Bean容器，帮我们管理项目中使用到的类
 */
public class Demo {
    public static void main(String[] args) throws Exception{
        //需求：使用到Person类的sayhello方法
        /*
        1：硬编码，自己new，然后调用方法
          优点：性能好，简单
          缺点：耦合高（代码写死了，还能使用Person。后期想更换其他类这里Demo要跟着修改） ，可维护性差成本高
         */
        Person p = new Person();
        p.sayHello();
        /*
        2.反射机制
          优点：解耦合，可维护性高，可扩展性高
          缺点：性能低，代码复杂,编写复杂的反射代码
         */
        Class cls = Class.forName("demo1.Person");
         Person p2 = (Person) cls.newInstance();
         p2.sayHello();
         /*
         3.使用Spring容器
           使用容器后，有一个模式发生了改变，就是当我们需要使用到一个类的实例是，从原本我们主动实例化（无论是硬编码还是反射）现在转变为想容器“要”对象使用
           这种转变：
           原来，我们使用谁，实例化谁这个操作的控制代码有我们自己编写。
           现在转变为向容器要，这意味着对象的实例化（对象的初始化）的控制由容器来完成。这就是IoC(控制反转)。
          */
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("demo1"); // 创建Spring容器
        Person p3 = context.getBean(Person.class); // 从Spring容器中获取Person对象(拿豆子)
         p3.sayHello();
    }
}
